package com.guqj.basis;

public class FinalizeTest {

	public static FinalizeTest object;
	byte[] _200M = new byte[200 * 1024 * 1024];

	public void isAlive() {
		System.out.println("I'm alive");
	}

	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("method finalize is running");
		object = this; // 对象object重写了finalize()方法，且还未执行过，那么object会被插入到F-Queue队列中，由一个虚拟机自动创建的、低优先级的Finalizer线程触发其finalize()方法。finalize()方法是对象逃脱死亡的最后机会，GC会对队列中的对象进行第二次标记。
						// 如果object在finalize()方法中与引用链上的任何一个对象建立联系，那么在第二次标记时，object会被移出“即将回收”集合.PS:
						// finalize只会被执行一次
	}

	public static void main(String[] args) throws InterruptedException {
		object = new FinalizeTest();

		// 第一次执行，finalize方法会自救
		object = null;
		System.gc();

		Thread.sleep(500);
		if (object != null) {
			object.isAlive();
		} else {
			System.out.println("I'm dead");
		}

		// 第二次执行，finalize方法已经执行过 由于finalize方法只会被JVM调用一次，object被回收
		object = null;
		System.gc();

		Thread.sleep(500);
		if (object != null) {
			object.isAlive();
		} else {
			System.out.println("I'm dead");
		}
	}
}
